package com.rem.concurrency.juc.my14Cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS ： 比较当前工作内存中的值和主内存中的值，如果这个值是期望的，那么则执行操作！如果不是就
 * 一直循环！
 * 缺点：
 * 1、 循环会耗时
 * 2、一次性只能保证一个共享变量的原子性
 * 3、ABA问题
 * aba问题描述：A把初始值改掉然后又改回初始值 但是对于B来说看到的还是一样的内容，乐观锁的体现
 *
 * @author Rem
 * @date 2021-03-11
 */

public class CasDemo {

    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2000);

        // 如果我期望的值达到了，那么就更新，否则，就不更新, CAS 是CPU的并发原语！
        atomicInteger.compareAndSet(2000, 3000);


        //值已经从2000改成3000了
        System.err.println(atomicInteger);


        //已经是3000了 不会再改了
        atomicInteger.compareAndSet(2000, 3000);

        System.err.println(atomicInteger);

    }
}
